package web

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
	"log"
	"mallgo/logger"
	"net/http"
)

var minioClient *minio.Client

func initMinio() {
	var err error
	minioClient, err = minio.New("127.0.0.1:9000", &minio.Options{
		Creds:  credentials.NewStaticV4("minioadmin", "minioadmin", ""),
		Secure: false, // true 表示使用 HTTPS
	})
	if err != nil {
		log.Fatalln("MinIO 连接失败:", err)
	}
	logger.Info("MinIO 连接成功")
}

func uploadFile(c *gin.Context) {
	// 获取上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "文件上传失败"})
		return
	}

	// 打开文件
	src, err := file.Open()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "无法读取文件"})
		return
	}
	defer src.Close()

	// 目标存储桶（bucket）
	bucketName := "uploads"
	objectName := file.Filename // MinIO 中的对象名

	// 检查存储桶是否存在，不存在则创建
	ctx := context.Background()
	exists, err := minioClient.BucketExists(ctx, bucketName)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "检查存储桶失败"})
		return
	}
	if !exists {
		err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"error": "创建存储桶失败"})
			return
		}
	}

	// 上传文件到 MinIO
	_, err = minioClient.PutObject(ctx, bucketName, objectName, src, file.Size, minio.PutObjectOptions{ContentType: file.Header.Get("Content-Type")})
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "上传到 MinIO 失败"})
		return
	}

	// 生成 MinIO 访问 URL（公有访问）
	fileURL := fmt.Sprintf("http://127.0.0.1:9000/%s/%s", bucketName, objectName)

	// 返回文件 URL
	c.JSON(http.StatusOK, gin.H{"message": "上传成功", "url": fileURL})
}
